//  IO 函子

const fp = require('lodash/fp')

class IO { 
  static of(x) { 
    return new IO(() => x)
  }
  constructor(fn) { 
    this._val = fn
  }

  map(fn) { 
    // 把当前的值和传入的值 组成一个新的函数
    return new IO(fp.flowRight(fn, this._val))
  }
}


// 调用
/**
 * process node 进程
 * execPath node 进程执行的路径
 */
let r = IO.of(process).map(p => p.execPath)

console.log(r); // IO { _val: [Function] }
console.log(r._val()); // C:\Program Files\nodejs\node.exe
